package bat.iog.hytool.pattern.behavioral.observer.demo01;

/**
 * 观察者模式
 * 1.监听器就是一个实现了特定接口的普通Java程序，
 * 这个程序专门用于监听另一个Java对象的方法调用或者属性改变。当被监听对象发生上述事件后，
 * 监听器某个方法将立即被执行。
 * 2.被监听对象发生某个行为时，会主动告诉Listener（对象方法调用），让它执行对应的特定操作！
 *
 * 3.Listener
 * 大致来说，常用的监听器就是“6+2”：
 *
 * 6个常规监听器
 *     |---ServletContext
 *             |---ServletContextListener（生命周期监听）
 *             |---ServletContextAttributeListener（属性监听）
 *     |---HttpSession
 *             |---HttpSessionListener（生命周期监听）
 *             |---HttpSessionAttributeListener（属性监听）
 *     |---ServletRequest
 *             |---ServletRequestListener（生命周期监听）
 *             |---ServletRequestAttributeListener（属性监听）
 *
 * 2个感知监听
 *     |---HttpSessionBindingListener
 *     |---HttpSessionActivationListener
 */
public class ObserverTest {
    public static void main(String[] args) {
        // 被监听对象
        Thief thief = new Thief();

        // 监听器，直接new一个接口的匿名类对象
        ThiefListener thiefListener = new ThiefListener() {
            public void shot(Event event) {
                System.out.println("啪啪啪！！！！");
            }
        };

        // 注册监听
        thief.registerListener(thiefListener);

        // 特定行为，触发监听器：内部调用listener.shot()
        thief.steal();

        System.out.println("--------------");

        EatListener eatListener =new EatListener() {
            public void makefood(Event event) {
                System.out.println("make food...");
                System.out.println("监听到某个方法执行！");
            }
        };

        thief.registereatListener(eatListener);
        thief.eat();
    }
}
